import { AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig, CancelToken } from 'axios';

// 请求方法枚举
export enum RequestMethod {
  GET = 'get',
  POST = 'post',
  PUT = 'put',
  DELETE = 'delete',
  PATCH = 'patch',
}

// 请求拦截器参数类型
export interface RequestInterceptors {
  // 请求拦截器
  requestInterceptor?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig;
  // 请求错误拦截器
  requestInterceptorCatch?: (error: any) => any;
  // 响应拦截器
  responseInterceptor?: <T = any>(response: AxiosResponse<T>) => AxiosResponse<T> | T;
  // 响应错误拦截器
  responseInterceptorCatch?: (error: any) => any;
}

// 自定义请求配置
export interface RequestConfig extends AxiosRequestConfig {
  // 是否显示加载中提示
  showLoading?: boolean;
  // 加载提示文本
  loadingText?: string;
  // 是否开启请求重试
  retry?: boolean;
  // 重试次数
  retryCount?: number;
  // 重试延迟时间 (毫秒)
  retryDelay?: number;
  // 是否需要对响应数据进行处理
  transform?: boolean;
  // 请求拦截器
  interceptors?: RequestInterceptors;
  // 是否使用 Mock 数据
  useMock?: boolean;
  // 取消令牌标识（字符串ID，用于引用）
  cancelTokenId?: string;
  // 取消令牌（由Axios提供的CancelToken类型）
  cancelToken?: CancelToken;
}

// 响应数据结构 (根据后端实际返回格式定义)
export interface ResponseData<T = any> {
  // 状态码
  code: number;
  // 数据
  data: T;
  // 消息
  message: string;
  // 是否成功
  success: boolean;
}

// HTTP 错误类型
export interface HttpError extends Error {
  // 错误码
  code?: string | number;
  // 错误消息
  message: string;
  // 原始错误信息
  originalError?: any;
  // 配置
  config?: RequestConfig;
  // 响应
  response?: AxiosResponse;
} 